package com.ipartek.formacion.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.ipartek.formacion.beans.Persona;
import com.ipartek.formacion.interfaces.InterfacePersonaDAO;

/**
 * Clase para interactuar con la tabla de Personas
 * 
 * @author Jonatan
 */
public class MySqlPersonaDAO implements InterfacePersonaDAO {

	private Connection conexion = null;
	// Variables log
	// Variable para trabajar con la logger
	private static final Logger log = Logger.getLogger(MySqlPersonaDAO.class);
	// Variable para trabajar el archivo log4j.properties
	private static final String LOG4J_PROPERTIES = "config/log4j.properties";

	// constantes para los nombres de las tablas a utilizar en la SQL
	private static final String TABLA_Persona = "personas";

	// ***********************//
	// ****** CONTRUCTOR *****//
	// ***********************//
	public MySqlPersonaDAO() {
		PropertyConfigurator.configure(LOG4J_PROPERTIES);
		try {
			conexion = MySqlDAOFactory.conectar();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// ***********************//
	// ******* METODOS *******//
	// ***********************//

	@Override
	/**
	 * Borra una persona de la BBDD de personas
	 */
	public boolean deletePersona(Persona persona) throws Exception {
		boolean resultado = false;
		String sql = "DELETE FROM " + TABLA_Persona + " WHERE id =?";

		log.info("Se ejecuta la SQL : " + sql);

		try {
			PreparedStatement stmt = conexion.prepareStatement(sql);
			stmt.setInt(1, persona.getID());

			stmt.executeUpdate();
			resultado = true;
		} catch (SQLException ex) {
			SQLException e = ex;
			while (ex != null) {
				log.fatal("MySqlPersonaDAO.deletePersona() Message: "
						+ ex.getMessage() + "SQLState: " + ex.getSQLState()
						+ "ErrorCode: " + ex.getErrorCode());
				ex = ex.getNextException();
			}
			throw e;
		} catch (Exception ex) {
			log.fatal("Se ha producido una excepcion en MySqlPersonaDAO.deletePersona()"
					+ ex.getMessage());
			throw ex;
		}
		return resultado;
	}

	@Override
	/**
	 * Inserta una perdona en BBDD en la tabla personas
	 */
	public boolean insertPersona(Persona Persona) throws Exception {
		boolean resultado = false;
		String sql = null;
		/*
		 * Agregamos a la tabla Personas los datos necesarios de la Persona
		 */
		sql = "INSERT INTO "
				+ TABLA_Persona
				+ " (nombre, apellido1, apellido2, dni, email, edad, rol, fecha_alta, fecha_modificacion, fecha_baja) "
				+ "VALUES (?,?,?,?,?,?,?,CURRENT_TIMESTAMP,null,null)";

		log.info("Se inserta en BBDD la persona " + Persona.getNombre() + " "
				+ Persona.getApellido1() + " " + Persona.getApellido2());

		try {
			PreparedStatement stmt = conexion.prepareStatement(sql);

			stmt.setString(1, Persona.getNombre());
			stmt.setString(2, Persona.getApellido1());
			stmt.setString(3, Persona.getApellido2());
			stmt.setString(4, Persona.getDni());
			stmt.setString(5, Persona.getEmail());
			stmt.setInt(6, Persona.getEdad());
			stmt.setString(7, Persona.getRol().toString());
			stmt.executeUpdate();

			resultado = true;
		} catch (SQLException ex) {
			SQLException e = ex;
			while (ex != null) {
				log.fatal("MySqlPersonaDAO.insertPersona() Message: "
						+ ex.getMessage() + "SQLState: " + ex.getSQLState()
						+ "ErrorCode: " + ex.getErrorCode());
				ex = ex.getNextException();
			}
			throw e;
		} catch (Exception ex) {
			log.fatal("Se ha producido una excepcion en MySqlPersonaDAO.getPersonas()"
					+ ex.getMessage());
			throw ex;
		}
		return resultado;
	}

	/**
	 * Realiza COMMIT en la BBDD de personas
	 */
	public void commit() throws Exception {
		try {
			MySqlDAOFactory.commit(conexion);
		} catch (Exception ex) {
			log.fatal("Se ha producido una excepcion en MySqlPersonaDAO.commit()"
					+ ex.getMessage());
			throw ex;
		} finally {
			MySqlDAOFactory.desconectar(conexion);
		}
	}

	/**
	 * Realiza ROLLBACK en la BBDD de personas
	 */
	public void rollback() throws Exception {
		try {
			MySqlDAOFactory.rollback(conexion);
		} catch (Exception ex) {
			log.fatal("Se ha producido una excepcion en MySqlPersonaDAO.rollback()"
					+ ex.getMessage());
			throw ex;
		} finally {
			MySqlDAOFactory.desconectar(conexion);
		}
	}

	@Override
	public boolean updatePersona(Persona Persona) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean selectPersona(Persona persona) throws Exception {
		// TODO Auto-generated method stub
		return false;
	}
}
